/*
 * ManejadorHash.cpp
 *
 *  Created on: 03/06/2010
 *      Author: Grupo Klow
 */

#include "ManejadorHash.h"


	ManejadorHash::ManejadorHash(string nombre_archivo){

		//Supone nombre_archivo no vacio

		char* nombre_temp = ManejadorContexto::getNombreTemp(nombre_archivo);

		this->hash = CrearHashExtensible(LONGITUD_BLOQUE, nombre_temp);

		setEsTemporal(this->hash, TRUE);

		delete []nombre_temp;
	}

	Contexto* ManejadorHash::buscarContexto(string contextoNombre){

		unsigned int long_clave = contextoNombre.length();
		if (long_clave >= 0)
		{
			TClave clave_aux = new char[long_clave + 1];
			clave_aux[0] = '\0';
			strcpy(clave_aux, contextoNombre.c_str());

			char * contextoData = (char *) ObtenerElemento(this->hash, clave_aux);
			if (contextoData != NULL)
			{
				delete []clave_aux;
				Contexto * ctx = new Contexto(contextoData, contextoNombre);
				free(contextoData);
				return ctx;
			}

			delete []clave_aux;
			//contextoData es NULL, asique no se libera
		}
		return NULL;
	}

	ManejadorContexto::Resultado ManejadorHash::altaContexto(Contexto* contexto){
		int tamanioData = 0;
		char * contextoData = contexto->contextoABytes(&tamanioData);

		TClave clave_aux = new char[contexto->getNombre().length() + 1];
		strcpy(clave_aux, contexto->getNombre().c_str());

		int resultado = InsertarElemento(this->hash, clave_aux, contextoData, tamanioData);

		delete []clave_aux;
		delete []contextoData;

		if (resultado == ERROR)
			return this->OPERACION_FALLIDA;
		else
			return this->OPERACION_EXITOSA;
	}

	ManejadorContexto::Resultado ManejadorHash::modificarContexto(Contexto* contexto){
		int tamanioData = 0;
		char * contextoData = contexto->contextoABytes(&tamanioData);

		TClave clave_aux = new char[contexto->getNombre().length() + 1];
		strcpy(clave_aux, contexto->getNombre().c_str());

		int resultado = ModificarElemento(this->hash, clave_aux, contextoData, tamanioData);

		delete []clave_aux;
		delete []contextoData;

		if (resultado == ERROR)
			return this->OPERACION_FALLIDA;
		else
			return this->OPERACION_EXITOSA;
	}

	void ManejadorHash::imprimirContextos(FILE * salida){

		iteradorHash * it = CrearIteradorHash();
		TClave nombreContexto = NULL;

		//intenta levantar el primer elemento
		char * ctxData = (char*) getSiguienteElem(this->hash, it, &nombreContexto);

		while (ctxData != NULL)
		{
			Contexto * ctx = new Contexto(ctxData, nombreContexto);
			free(ctxData);
			imprimirHelper(salida, ctx);
			delete (ctx);
			free(nombreContexto);
			nombreContexto = NULL;
			ctxData = (char*) getSiguienteElem(this->hash, it, &nombreContexto);
		}
		EliminarIteradorHash(it);
	}

	ManejadorHash::~ManejadorHash(){

		if(hash)
			CerrarHashExtensible(this->hash);
	}
